/**
 * @project_name thread
 * @package_name com.gxwz.thread
 * @file_name Java5SpecificSemaphoreClass4Thread.java
 */
package com.gxwz.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 
 * @author chendequan
 * @email 1527254027@qq.com
 * @datetime 2013-9-6 下午01:36:22
 * 
 */
public class Java5SpecificSemaphoreClass4Thread {
//	Semaphore 可以维护当前访问自身线程个数，
//	并提供了同步机制，使用可以控制同时访问资源的线程个数
	public static void main(String[] args) throws InterruptedException {
		ExecutorService service = Executors.newCachedThreadPool();
//		创建具有给定的许可数和非公平的公平设置的 Semaphore。
		final Semaphore sp = new Semaphore(3);
		
		for (int i = 0; i < 10; i++) {  //往线程池里放10个任务
			Runnable runnable = new Runnable() {
				public void run() {
					try {
//						 从此信号量获取一个许可，在提供一个许可前一直将线程阻塞，否则线程被中断。
						sp.acquire();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
//					availablePermits 返回此信号量中当前可用的许可数。
					System.out.println(sp.availablePermits());
//					释放给定数目的许可，将其返回到信号量。 
					sp.release();
				}
			};
			service.execute(runnable);
		}
	}
}

//-----------------结果--------
// 每次运行的结果是不一样的。因为每个线程执行的任务是不固定的，随机的
//10个任务3个线程

//2
//1
//1
//2
//2
//2
//0
//0
//1
//0

